package com.sprouting.ops.service;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.DromaraPartDetailDao;
import com.sprouting.ops.model.DromaraPartDetail;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.upload.FilePartInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 用来将文件分片上传记录保存到数据库
 * 目前仅手动分片分片上传时使用-框架使用，个人项目中的分片数据不存储在这里
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2025/2/13 14:17
 */
@Service
@Slf4j
public class DromaraPartDetailService extends ServiceImpl<DromaraPartDetailDao, DromaraPartDetail> {

    @Resource
    private DromaraPartDetailDao dromaraPartDetailDao;


    /*
    ========================= 官方公开方法 start ============================
    ========================= 官方公开方法 start ============================
    ========================= 官方公开方法 start ============================
     */


    /**
     * 保存文件分片信息
     * @param info 文件分片信息
     */
    public void saveFilePart(FilePartInfo info) {
        DromaraPartDetail detail = toFilePartDetail(info);
        dromaraPartDetailDao.insert(detail);
        info.setId(detail.getId());
    }

    /**
     * 删除文件分片信息
     */
    public void deleteFilePartByUploadId(String uploadId) {
        // dromaraPartDetailDao.delete(new QueryWrapper<DromaraPartDetail>().eq("upload_id", uploadId)); 第一种写法
        dromaraPartDetailDao.delete(new LambdaQueryWrapper<DromaraPartDetail>().eq(DromaraPartDetail::getUploadId, uploadId));
    }

    /*
    ========================= 官方公开方法 end ============================
    ========================= 官方公开方法 end ============================
    ========================= 官方公开方法 end ============================
     */


    /*
    ========================= 官方私有方法 start ============================
    ========================= 官方私有方法 start ============================
    ========================= 官方私有方法 start ============================
     */

    /**
     * 将 FilePartInfo 转成 FilePartDetail
     * @param info 文件分片信息
     */
    private DromaraPartDetail toFilePartDetail(FilePartInfo info) {
        DromaraPartDetail detail = BeanUtil.copyProperties(info, DromaraPartDetail.class);
        detail.setPlatform(info.getPlatform());
        detail.setUploadId(info.getUploadId());
        detail.setETag(info.getETag());
        detail.setPartNumber(info.getPartNumber());
        detail.setPartSize(info.getPartSize());
        detail.setHashInfo(valueToJson(info.getHashInfo()));
        detail.setCreateTime(info.getCreateTime());
        return detail;
    }

    /**
     * 将指定值转换成 json 字符串
     */
    private String valueToJson(Object value) {
        if (value == null) {
            return null;
        }
        return JSONUtil.toJsonStr(value);
    }

    /*
    ========================= 官方私有方法 end ============================
    ========================= 官方私有方法 end ============================
    ========================= 官方私有方法 end ============================
     */
}
